package entidades;

import gestordeentidades.persistance.DataBaseObject;
import java.util.Set;
import entidades.interfaces.IEstilo;
import gestordeentidades.GestorDeEntidades;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;

/**
 * Trabalho DAS - 2014/2015
 * @author a21210380, a21190325, a21210392
 */
public class Familia extends DataBaseObject {
    private String nome;
    private Cor corLinhaDefault;
    private Cor corTextoDefault;
    private Textura fundoDefault;
    
    protected Map<String, IEstilo> estilos = null;
    
    public Familia(String nome, Cor corLinhaDefault, Cor corTextoDefault, Textura fundoDefault) {
        this.nome = nome;
        this.corLinhaDefault = corLinhaDefault;
        this.corTextoDefault = corTextoDefault;
        this.fundoDefault = fundoDefault;
    }

    @Override
    public String toString() {
        return nome;
    }
    
    public String getNome() {
        return nome;
    }

    public Familia setNome(String nome) {
        this.nome = nome;
        return this;
    }

    public Cor getCorLinhaDefault() {
        return corLinhaDefault;
    }

    public Familia setCorLinhaDefault(Cor corLinhaDefault) {
        this.corLinhaDefault = corLinhaDefault;
        return this;
    }

    public Cor getCorTextoDefault() {
        return corTextoDefault;
    }

    public Familia setCorTextoDefault(Cor corTextoDefault) {
        this.corTextoDefault = corTextoDefault;
        return this;
    }

    public Textura getFundoDefault() {
        return fundoDefault;
    }

    public Familia setFundoDefault(Textura fundoDefault) {
        this.fundoDefault = fundoDefault;
        return this;
    }
    
    public boolean addEstilo(IEstilo estilo) {
        verificarEstilos();
        if(estilos.containsKey(estilo.getNomeDoEstilo())) {
            return false;
        }
        estilos.put(estilo.getNomeDoEstilo(), estilo);
        return true;
    }
    
    public boolean removeEstilo(IEstilo estilo) {
        verificarEstilos();
        if(!estilos.containsKey(estilo.getNomeDoEstilo())) {
            return false;
        }
        estilos.remove(estilo.getNomeDoEstilo());
        return true;
    }
    
    public boolean contemEstilo(IEstilo estilo) {
        verificarEstilos();
        return estilos.containsKey(estilo.getNomeDoEstilo());
    }
    
    public Set<String> getNomeDosEstilos() {
        verificarEstilos();
        return estilos.keySet();
    }

    public IEstilo getEstilo(String nomeDoEstilo) {
        verificarEstilos();
        return estilos.get(nomeDoEstilo);
    }
    
    private void verificarEstilos() {
        if(estilos == null) {
            estilos = GestorDeEntidades
                    .getInstance()
                    .procurarPorTodasAsEntidadesComoMapa(Estilo.class)
                    .values()
                    .stream()
                    .filter((Estilo e) -> {
                        return e.getFamilia() == this;
                    })
                    .collect(Collectors.toMap((Estilo e) -> {return e.getNomeDoEstilo();}, (Estilo e) -> {return e;}));
        }
    }
    
    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (obj == this) {
            return true;
        }
        if (obj instanceof Familia) {
            Familia c = (Familia) obj;
            return nome.equals(c.getNome());
        }
        return false;
    }

    @Override
    public int hashCode() {
        int hash = 5;
        hash = 47 * hash + Objects.hashCode(this.nome);
        return hash;
    }
    
}
